// 对象赋值
let obj1 = {
  name: '柚子',
  arr: [1, [2, 3], 4],
}

// let obj2 = obj1

// obj2.name = 'voerli'

// obj2.arr[1] = [5, 6, 7]

// console.log('obj1', obj1) 
// console.log('obj2', obj2) 
// 浅拷贝
// let obj1 = {
//   name: '柚子',
//   arr: [1, [2, 3], 4],
// }
// let obj3 = shallowClone(obj1)
// obj3.name = 'voerli'
// obj3.arr[1] = [5, 6, 7] // 新旧对象还是共享同一块内存
// // 这是个浅拷贝的方法
// function shallowClone(source) {
//     const object = {}
//     for(var k in source){
//         if(source.hasOwnProperty(k)){
//             object[k] = source[k]
//         }
//     }
//     return object
// }
// console.log('obj1', obj1)
// console.log('obj3', obj3)
// 深拷贝
// let obj1 = {
//     name : '柚子',
//     arr : [1,[2,3],4],
// };
// let obj4=deepClone(obj1)
// obj4.name = "voerli";
// obj4.arr[1] = [5,6,7] ; // 新对象跟原对象不共享内存
// // 这是个深拷贝的方法
// function deepClone(obj) {
//     if (obj === null) return obj; 
//     if (obj instanceof Date) return new Date(obj);
//     if (obj instanceof RegExp) return new RegExp(obj);
//     if (typeof obj !== "object") return obj;
//     let cloneObj = new obj.constructor();
//     for (let key in obj) {
//       if (obj.hasOwnProperty(key)) {
//         // 实现一个递归拷贝
//         cloneObj[key] = deepClone(obj[key]);
//       }
//     }
//     return cloneObj;
// }
// console.log('obj1',obj1) 
// console.log('obj4',obj4) 

let obj = {
    
    name : '橘子',
    name : '柚子',
    arr : [1,[2,3],4],
};
let b = deepClone(obj)
b.arr[1]= ['哈哈哈']
function deepClone(obj, hash = new WeakMap()) {
    if (obj === null) return obj; // 如果是null或者undefined我就不进行拷贝操作
    if (obj instanceof Date) return new Date(obj);
    if (obj instanceof RegExp) return new RegExp(obj);
    // 可能是对象或者普通的值  如果是函数的话是不需要深拷贝
    if (typeof obj !== "object") return obj;
    // 是对象的话就要进行深拷贝
    if (hash.get(obj)) return hash.get(obj);
    let cloneObj = new obj.constructor();
    // 找到的是所属类原型上的constructor,而原型上的 constructor指向的是当前类本身
    hash.set(obj, cloneObj);
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        // 实现一个递归拷贝
        cloneObj[key] = deepClone(obj[key], hash);
      }
    }
    return cloneObj;
  }
console.log('b----',b)
  
